﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using BLL;
using Entities;
using DAL;
using System.Linq;
using DAL.IRepository;

namespace WindowsApp.QLThoiKhoaBieuDN
{
    public partial class frmTaoTKBDN : DevComponents.DotNetBar.Office2007Form
    {
        QuanLyTKBDeNghiManager _qlTKB = new QuanLyTKBDeNghiManager(new GeneralRepository<QuanLyTKBDeNghi>());
        ChiTietThoiKhoaBieuDeNghiManager _ctTKB = new ChiTietThoiKhoaBieuDeNghiManager(new GeneralRepository<ChiTietThoiKhoaBieuDeNghi>());
        private bool _selectAll = false;
        string lbHK = "ĐỀ NGHỊ XẾP GIỜ GIẢNG HỌC KÌ ";
        string lbTuan = "TUẦN ";
        string lbNgay = " TỪ NGÀY ... ĐẾN NGÀY ... THÁNG ... NĂM ...";
        //Lay gia tri cho ma TKB
        string tuan, hk, nam = "";
        //
        DateTime _ngayDau, _ngayCuoi, _ngayLap = DateTime.Now;
        List<ChiTietKeHoachGiangDay> dsKH = new List<ChiTietKeHoachGiangDay>();
        List<ChiTietThoiKhoaBieuDeNghi> dsTKB = new List<ChiTietThoiKhoaBieuDeNghi>();
        List<List<ChiTietKeHoachGiangDay>> dsKHTheoLop = new List<List<ChiTietKeHoachGiangDay>>();
        List<List<ChiTietThoiKhoaBieuDeNghi>> dsTKBTheoLop = new List<List<ChiTietThoiKhoaBieuDeNghi>>();
        List<string> dsLop = new List<string>();
        int index = 0;
        int totalClass = 0;
        public frmTaoTKBDN()
        {
            InitializeComponent();
            dgvThoiKhoaBieu.AutoGenerateColumns = false;
        }

        private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e)
        {
            lblHK.Text =lbHK  + cbbHocKi.SelectedItem.ToString();
            hk = "0" + (cbbHocKi.SelectedIndex + 1);
            txtMaTKB.Text = "TKB" + nam + hk + tuan;
        }

        private void frmTaoTKBDN_Load(object sender, EventArgs e)
        {
            dsKH = ChiTietKeHoachGiangDay.Objects.GetAll().ToList();
            cbbHocKi.SelectedIndex = 0;
            lblNayLapBang.Text = "Đà Lạt, ngày " + _ngayLap.Day + ", tháng " + _ngayLap.Month + ", năm " + _ngayLap.Year;
        }

        private void mtxtTuan_TextChanged(object sender, EventArgs e)
        {
            if (mtxtTuan.Text.Length == 0)
                tuan = "";
            if(mtxtTuan.Text.Length==2&&Convert.ToInt32(mtxtTuan.Text)<10)
                mtxtTuan.Text = (Convert.ToInt32(mtxtTuan.Text)).ToString();
            lblThoiGian.Text = lbTuan + mtxtTuan.Text + lbNgay;
            tuan = mtxtTuan.Text.PadLeft(2, '0');
            txtMaTKB.Text = "TKB" + nam + hk + tuan;
        }

        private void dtpNgayDT_TextChanged(object sender, EventArgs e)
        {
            
            _ngayDau = dtpNgayDT.Value;
            if (_ngayDau.DayOfWeek != DayOfWeek.Monday || _ngayDau<=_ngayLap.AddDays(5))
            {
                MessageBox.Show("Ngày đầu phải là thứ 2 hàng tuần\nNgày đầu tuần phải sau ngày lập ít nhất 5 ngày","Chọn ngày không hợp lệ");
                dtpNgayDT.ResetText();
                nam = "";
                txtMaTKB.Text = "TKB" + nam + hk + tuan;
                return;
            }
            _ngayCuoi = _ngayDau.AddDays(6);
            lbNgay = " TỪ NGÀY " + _ngayDau.Day + " ĐẾN NGÀY " + _ngayCuoi.Day + " THÁNG " + _ngayCuoi.Month + " NĂM " + _ngayCuoi.Year;
            lblThoiGian.Text = lbTuan + mtxtTuan.Text + lbNgay;
            nam = _ngayDau.Year.ToString().Substring(2);
            txtMaTKB.Text = "TKB" + nam + hk + tuan;
        }

        private void btnChonLop_Click(object sender, EventArgs e)
        {
            frmChonLop frm = new frmChonLop();
            if (frm.ShowDialog() == DialogResult.OK && frm.ds.Count > 0)
            {
                foreach (string str in frm.ds)
                    if (!dsLop.Contains(str))
                        dsLop.Add(str);
                totalClass = dsLop.Count;
                index = 0;
                TachDSMonHoc();
                XuLyDgv();
                EnableCompoent();
            }

        }

        void TachDSMonHoc()
        {
            for (int i = 0; i < totalClass; i++)
            {
                dsKHTheoLop.Add(new List<ChiTietKeHoachGiangDay>());
                dsTKBTheoLop.Add(new List<ChiTietThoiKhoaBieuDeNghi>());
                foreach (ChiTietKeHoachGiangDay ct in dsKH)
                    if (ct.MaLop == dsLop[i])
                    {
                        dsKHTheoLop[i].Add(ct);
                        ChiTietThoiKhoaBieuDeNghi tkb = new ChiTietThoiKhoaBieuDeNghi();
                        tkb.MaKH = ct.MaKH;
                        dsTKBTheoLop[i].Add(tkb);
                    }
                
            }

        }

        void XuLyDgv()
        {
            lblCurrentClass.Text = "Lớp đang xếp TKB: " + dsLop[index];
            txtChiSo.Text = (index + 1) + "/" + totalClass;
            dgvThoiKhoaBieu.DataSource = null;
            if (totalClass > 0)
            {
                dgvThoiKhoaBieu.DataSource = dsKHTheoLop[index];
                BoSungTKBTheoLop();
            }
        }

        void CapNhatTKBTheoLop()
        {
            foreach (DataGridViewRow r in dgvThoiKhoaBieu.Rows)
            {
                dsTKBTheoLop[index][r.Index].MaDN = txtMaTKB.Text;
                dsTKBTheoLop[index][r.Index].SoTietCanXep = Convert.ToInt32(r.Cells[8].Value);
                dsTKBTheoLop[index][r.Index].SoTietThucHanhCanXep = Convert.ToInt32(r.Cells[10].Value);
                try
                {
                    dsTKBTheoLop[index][r.Index].DeNghi = r.Cells[11].Value.ToString();
                }
                catch { }
            }
        }

        void CapNhatMaTKBChoMonHoc()
        {
            foreach (List<ChiTietThoiKhoaBieuDeNghi> ls in dsTKBTheoLop)
                foreach (ChiTietThoiKhoaBieuDeNghi ct in ls)
                    ct.MaDN = txtMaTKB.Text;
        }

        void BoSungTKBTheoLop()
        {
            foreach (DataGridViewRow r in dgvThoiKhoaBieu.Rows)
            {
                r.Cells[8].Value = (dsTKBTheoLop[index][r.Index].SoTietCanXep == 0 ? null : dsTKBTheoLop[index][r.Index].SoTietCanXep.ToString());
                r.Cells[9].Value = (dsTKBTheoLop[index][r.Index].SoTietLyThuyetCanXep == 0 ? null : dsTKBTheoLop[index][r.Index].SoTietLyThuyetCanXep.ToString());
                r.Cells[10].Value = (dsTKBTheoLop[index][r.Index].SoTietThucHanhCanXep == 0 ? null : dsTKBTheoLop[index][r.Index].SoTietThucHanhCanXep.ToString());
                r.Cells[11].Value = dsTKBTheoLop[index][r.Index].DeNghi;
            }
        }

        void EnableCompoent()
        {
            txtChiSo.Enabled = true;
            btnTruoc.Enabled = true;
            btnSau.Enabled = true;
            btnLamMoi.Enabled = true;
            btnXoa.Enabled = true;
            btnXoaLop.Enabled = true;
            btnLuu.Enabled = true;
        }

        void DisableCompoent()
        {
            index = 0;
            totalClass = 0;
            txtChiSo.Text = "0/0";
            txtChiSo.Enabled = false;
            btnTruoc.Enabled = false;
            btnSau.Enabled = false;
            btnLamMoi.Enabled = false;
            btnXoa.Enabled = false;
            btnXoaLop.Enabled = false;
            btnLuu.Enabled = false;
        }

        private void btnTruoc_Click(object sender, EventArgs e)
        {
            CapNhatTKBTheoLop();
            index = Math.Max(--index, 0);
            XuLyDgv();
        }

        private void btnSau_Click(object sender, EventArgs e)
        {
            CapNhatTKBTheoLop();
            index = Math.Min(++index, totalClass-1);
            XuLyDgv();
        }

        private void txtChiSo_Click(object sender, EventArgs e)
        {
            txtChiSo.SelectAll();
        }

        private void txtChiSo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                CapNhatTKBTheoLop();
                int chiSo = index;
                string text = txtChiSo.Text;
                foreach(string lop in dsLop)
                    if (lop.IndexOf(text.ToUpper()) >= 0)
                    {
                        index = dsLop.IndexOf(lop);
                        break;
                    }
                if(chiSo==index)
                    try
                    {
                        chiSo = (int)(text.IndexOf('/') > 0 ? Convert.ToInt32(text.Substring(0, text.IndexOf('/'))) : Convert.ToInt32(text));
                        index = Math.Min(Math.Max(0, chiSo-1), totalClass-1);
                    
                    }
                    catch
                    {
                    }
                XuLyDgv();
            }

        }

        private void btnLamMoi_Click(object sender, EventArgs e)
        {
            dsKHTheoLop[index] = new List<ChiTietKeHoachGiangDay>();
            dsTKBTheoLop[index] = new List<ChiTietThoiKhoaBieuDeNghi>();
            foreach (ChiTietKeHoachGiangDay ct in dsKH)
                if (ct.MaLop == dsLop[index])
                {
                    dsKHTheoLop[index].Add(ct);
                    ChiTietThoiKhoaBieuDeNghi tkb = new ChiTietThoiKhoaBieuDeNghi();
                    tkb.MaKH = ct.MaKH;
                    dsTKBTheoLop[index].Add(tkb);
                }
            XuLyDgv();
            
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn xóa những môn đang chọn không", "Xóa môn", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) != DialogResult.OK)
                return;
            for(int i = dgvThoiKhoaBieu.Rows.Count-1;i>=0;i--)
                if (dgvThoiKhoaBieu.Rows[i].Cells[0].Value != null && dgvThoiKhoaBieu.Rows[i].Cells[0].Value.Equals(true))
                {
                    dsKHTheoLop[index].RemoveAt(i);
                    dsTKBTheoLop[index].RemoveAt(i);
                }
            XuLyDgv();
        }

        private void dgvThoiKhoaBieu_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex == 0 && dgvThoiKhoaBieu.Rows.Count > 0)
            {
                _selectAll = !_selectAll;
                for (int idx = 0; idx < dgvThoiKhoaBieu.Rows.Count; idx++)
                {
                    dgvThoiKhoaBieu.Rows[idx].Selected = _selectAll;
                    dgvThoiKhoaBieu.Rows[idx].Cells[0].Value = _selectAll;
                }
            }
        }

        private void btnXoaLop_Click(object sender, EventArgs e)
        {
            if(MessageBox.Show("Bạn có muốn xóa lớp đang xếp lịch không?","Xóa lớp",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1) != DialogResult.OK)
                return;
            dsKHTheoLop.RemoveAt(index);
            dsTKBTheoLop.RemoveAt(index);
            dsLop.RemoveAt(index);

            if (dsLop.Count == 0)
            {
                DisableCompoent();
                MessageBox.Show("Đã xóa hết lớp trong danh sách xếp TKB, vui lòng chọn lại lớp để xếp TKB","Thông báo");
                return;
            }
            totalClass = dsLop.Count;
            index = Math.Max(0,Math.Min(index, totalClass - 1));
            XuLyDgv();
        }

        private void dgvThoiKhoaBieu_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            DataGridViewCell cell = dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex];
            if (e.ColumnIndex == 8)
            {
                if (cell.Value == null)
                {
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].ReadOnly = true;
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 2].ReadOnly = true;
                    return;
                }
                int gt = Convert.ToInt32(cell.Value.ToString());
                if (gt > 0 && gt <= 30)
                {
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].ReadOnly = false;
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 2].ReadOnly = false;
                }
                else
                {
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].ReadOnly = true;
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 2].ReadOnly = true;
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = null;
                    MessageBox.Show("Số tiết xếp trong một tuần từ 1 --> 30", "Thông báo");
                }
                return;
            }
            if (e.ColumnIndex == 9 && cell.Value != null)
            {
                int gt = Convert.ToInt32(cell.Value.ToString());
                DataGridViewCell cell2 = dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex-1];
                int tietXep = Convert.ToInt32(cell2.Value.ToString()); ;
                if (gt <= tietXep)
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value = (tietXep-gt).ToString();
                else
                {
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = null;
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value = null;
                    MessageBox.Show("Số tiết lý thuyết phải nhỏ hơn hoặc bằng số tiết xếp", "Thông báo");
                }
                return;
            }
            if (e.ColumnIndex == 10 && cell.Value != null)
            {
                int gt = Convert.ToInt32(cell.Value.ToString());
                DataGridViewCell cell2 = dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex-2];
                int tietXep = Convert.ToInt32(cell2.Value.ToString()); ;
                if (gt <= tietXep)
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value = (tietXep - gt).ToString();
                else
                {
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = null;
                    dgvThoiKhoaBieu.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value = null;
                    MessageBox.Show("Số tiết thực phải nhỏ hơn hoặc bằng số tiết xếp", "Thông báo");
                }
            }
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            if (LuuQLTKB())
               LuuChiTietTKB();
        }
        bool LuuQLTKB()
        {
            QuanLyTKBDeNghi ql = new QuanLyTKBDeNghi();
            ql.MaDN = txtMaTKB.Text;
            try
            {
                ql.Tuan = Convert.ToInt32(mtxtTuan.Text);
            }
            catch { }
            ql.TuNgay = dtpNgayDT.Value;
            ql.GhiChu = txtGhiChu.Text;
            ql.NgayLap = _ngayLap;
            ql.NguoiLap = txtNguoiLapTKB.Text;
            var vResult = _qlTKB.Validate(ql);
            if (vResult.Valid)
            {
                var aResult = QuanLyTKBDeNghi.Objects.InsertOrUpdate(ql);
                if (aResult)
                    return true;
                else
                    MessageBox.Show("Thêm quản lý thời khóa biểu không thành công");
            }
            else MessageBox.Show(vResult.ToString());
            return false;
            
        }

        void LuuChiTietTKB()
        {
            int n = 0;
            CapNhatTKBTheoLop();
            CapNhatMaTKBChoMonHoc();
            foreach (List<ChiTietThoiKhoaBieuDeNghi> ls in dsTKBTheoLop)
                foreach (ChiTietThoiKhoaBieuDeNghi ct in ls)
                {
                    var aResult = _ctTKB.InsertOrUpdate(ct);
                    if (aResult.Success)
                    {
                        n++;
                    }
                    //else
                    //    MessageBox.Show(aResult.GetErrorMessages());
                }
            MessageBox.Show("Thêm hoặc cập nhật thành công "+n+" môn","Thông báo");
        }

        private void txtMaTKB_TextChanged(object sender, EventArgs e)
        {
            if (txtMaTKB.Text.Length == 9)
            {
                btnChonLop.Enabled = true;
                if(totalClass>0)
                    EnableCompoent();   
            }
            else
            {
                btnChonLop.Enabled = false;
                DisableCompoent();
            }
        }
    }
}
